package com.obligatorio.persist.dao;

import java.util.List;

import javax.ejb.Stateless;
import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;

import org.apache.log4j.Logger;

import com.obligatorio.domain.Estados;
import com.obligatorio.domain.Usuario;

@Stateless
@SuppressWarnings({ "static-access", "unchecked", "unused" })
public class UsuarioDAOBean implements UsuarioDAOLocal {

	private static final Logger log = Logger.getLogger(UsuarioDAOBean.class
			.getName());

	@PersistenceContext(unitName = "JPA_UNIT_OBL")
	EntityManager em;

	@Override
	public Usuario recuperarPass(Usuario user) throws Exception {
		try {
			return (Usuario) em
					.createNamedQuery("findUserRestPass", Usuario.class)
					.setParameter("EMail", user.getEmail())
					.setParameter("Nombre", user.getNombre())
					.setParameter("Apellido", user.getApellido())
					.getSingleResult();
		} catch (Exception e) {
			return null;
		}
	}

	@Override
	public Integer savePassword(Usuario user) throws Exception {
		Integer result = -1;
		try {
			Usuario tmpUsuario = (Usuario) em
					.createNamedQuery("findUserByEmail", Usuario.class)
					.setParameter("EMail", user.getEmail()).getSingleResult();

			if (user.getEmail().equals(tmpUsuario.getEmail())) {
				tmpUsuario.setPassword(user.getPassword());
				em.merge(tmpUsuario);
				result = 1;
			}
		} catch (Exception e) {
			return result;
		}
		return result;
	}

	@Override
	public Usuario signIn(Usuario login) throws Exception {
		Usuario tmpUsuario = null;
		try {
			tmpUsuario = (Usuario) em
					.createNamedQuery("findLogin", Usuario.class)
					.setParameter("EMail", login.getEmail())
					.setParameter("PASS", login.getPassword())
					.setParameter("STATUS", login.getEstado().ACTIVO)
					.getSingleResult();

		} catch (Exception e) {
			return tmpUsuario;
		}
		return tmpUsuario;
	}

	@Override
	public Boolean altaUsuario(Usuario user) throws Exception {
		log.info("altaUsuario() -> " + user.toString());
		Boolean result = false;
		try {
			em.persist(user);
			result = true;
		} catch (Exception e) {
			log.error(e.getCause());
			e.printStackTrace();
			return result;
		}
		return result;
	}

	@Override
	public Usuario modificarUsuario(Usuario user) throws Exception {
		// TODO Auto-generated method stub
		log.info("modificarUsuario() -> " + user.toString());
		Usuario tmpUsuario = null;
		try {

			// tmpUsuario = (Usuario) em
			// .createNamedQuery("findUserByEmail", Usuario.class)
			// .setParameter("EMail", user.getEmail()).getSingleResult();
			// s
			// tmpUsuario.setFechaNac(user.getFechaNac());
			// tmpUsuario.setPais(user.getPais());
			// tmpUsuario.setSector(user.getSector());

			return em.merge(user);
		} catch (Exception e) {
			log.error(e.getCause());
			e.printStackTrace();
		}
		return null;
	}

	@Override
	public Boolean existeUsuario(Usuario user) throws Exception {
		try {
			Usuario tmpUsuario = (Usuario) em
					.createNamedQuery("findUserByEmail", Usuario.class)
					.setParameter("EMail", user.getEmail()).getSingleResult();
			tmpUsuario = null;
			return true;
		} catch (Exception e) {
			return false;
		}
	}

	@Override
	public Usuario activarUsuario(String code) throws Exception {
		Usuario result = null;
		try {
			Usuario tmpUsuario = (Usuario) em
					.createNamedQuery("findUserByCodActive", Usuario.class)
					.setParameter("CodeActive", code).getSingleResult();
			if (tmpUsuario.getCodeActivate().equals(code)) {
				tmpUsuario.setEstado(Estados.ACTIVO);
				tmpUsuario.setCodeActivate(null);
				em.merge(tmpUsuario);
				result = tmpUsuario;
			}
		} catch (Exception e) {
			return result;
		}
		return result;
	}

	@Override
	public Usuario obtenerPerfil(Usuario user) throws Exception {
		Usuario tmpUsuario = null;
		try {
			tmpUsuario = em.createNamedQuery("findUser", Usuario.class)
					.setParameter("STATUS", user.getEstado().ACTIVO)
					.setParameter("Usuario", user).getSingleResult();
			// log.info("DAO> "+tmpUsuario.getNombre()+"Estudio> "+tmpUsuario.getEstudios().size());
		} catch (Exception e) {
			System.out.println("User obtenerPerfil DAO> " + e.toString());
			return null;
		}
		return tmpUsuario;
	}

	@Override
	public List<Usuario> buscarUsuario(String nombre, String apellido)
			throws Exception {
		// System.out.println("Nombre "+nombre+" Apellido DAO "+apellido);
		log.info("BuscarUsuarios()");
		List<Usuario> result = null;
		try {
			result = (List<Usuario>) em.createNamedQuery("findAllUser")
					.setParameter("STATUS", Estados.ACTIVO)
					.setParameter("nombre", "%" + nombre + "%")
					.setParameter("apellido", "%" + apellido + "%")
					.getResultList();
			log.info("Count Usuarios encontrados : " + result.size());
		} catch (Exception e) {
			e.printStackTrace();
			return null;
		}
		return result;
	}

	@Override
	public List<Usuario> buscarUsuarios() throws Exception {
		// System.out.println("Nombre "+nombre+" Apellido DAO "+apellido);
		log.info("BuscarUsuaros()");
		List<Usuario> result = null;
		try {
			result = (List<Usuario>) em.createNamedQuery("findAllUsers")
					.getResultList();
			log.info("Count Usuarios : " + result.size());
		} catch (Exception e) {
			e.printStackTrace();
			return null;
		}
		return result;
	}

	@Override
	public List<Usuario> buscarUsuariosUsuario(String email) throws Exception {
		// System.out.println("Nombre "+nombre+" Apellido DAO "+apellido);
		log.info("buscarUsuariosUsuario()");
		List<Usuario> result = null;
		try {
			result = (List<Usuario>) em.createNamedQuery("findUserContacts")
					.setParameter("STATUS", Estados.ACTIVO)
					.setParameter("email", email).getResultList();

			log.info("Count Usuarios : " + result.size());
		} catch (Exception e) {
			e.printStackTrace();
			return null;
		}
		return result;
	}

	@Override
	public List<Usuario> listaContacos(Usuario user) throws Exception {
		log.info("listaContacos()");
		List<Usuario> result = null;
		try {
			result = em.createNamedQuery("findUserContacts", Usuario.class)
					.setParameter("STATUS", user.getEstado().ACTIVO)
					.setParameter("Usuario", user).getResultList();
		} catch (Exception e) {
			log.error("Lista de Contacos DAO> " + e.toString());
			return null;
		}
		return result;
	}

	@Override
	public Boolean invitarContacto(Usuario user) throws Exception {
		Boolean result = false;
		try {
			Usuario tmpUsuario = (Usuario) em
					.createNamedQuery("findUser", Usuario.class)
					.setParameter("Usuario", user)
					.setParameter("STATUS", user.getEstado().ACTIVO)
					.getSingleResult();

			tmpUsuario.setContactos(user.getContactos());
			em.merge(tmpUsuario);
			result = true;
		} catch (Exception e) {
			log.error("Error " + e.toString());
		}
		return result;
	}

	@Override
	public Usuario buscarContacto(String email) throws Exception {
		Usuario u = null;
		u = (Usuario) em.createNamedQuery("findActiveUserByEmail")
				.setParameter("STATUS", Estados.ACTIVO)
				.setParameter("email", email).getSingleResult();
		return u;
	}

	@Override
	public void aceptarContacto(Usuario user) throws Exception {
		// Boolean result=false;
		try {
			Usuario tmpUsuario = (Usuario) em
					.createNamedQuery("findUser", Usuario.class)
					.setParameter("Usuario", user)
					.setParameter("STATUS", user.getEstado().ACTIVO)
					.getSingleResult();

			tmpUsuario.setContactos(user.getContactos());
			em.merge(tmpUsuario);
			// result = true;
		} catch (Exception e) {
			log.error("Error " + e.toString());
		}
		// return result;
	}

}
